#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""spider.py -u url -d deep -f logfile -l loglevel(1-5) --testself -thread number --dbfile filepath --key=”HTML5”
参数说明：
    -u 指定爬虫开始地址。默认www.amazon.com
    -d 指定爬虫深度
    –thread 指定线程池大小，多线程爬取页面，可选参数，默认10
    –dbfile 存放结果数据到指定的数据库（sqlite）文件中
    –key 页面内的关键词，获取满足该关键词的网页，可选参数，默认为所有页面
    -l 日志记录文件记录详细程度，数字越大记录越详细，可选参数，默认spider.log
    –testself 程序自测，可选参数
"""

import argparse

import crawler.amazon_product
import spider_logging

import crawler.amazon_product as c
import model as m
import persistence.amazon_product as p

logger = spider_logging.get_logger(__name__)


def on_amazon_product_extracted(_: c.LinkNode, product: m.AmazonProduct):
    p.persist(product)


if "__main__" == __name__:
    parser = argparse.ArgumentParser(description="amazon.com产品数据爬虫")
    parser.add_argument("-url", "-u", type=str, default="https://amazon.com", help="指定爬虫开始地址。")
    parser.add_argument("-depth", "-d", type=int, default=2, help="指定爬虫深度。")
    parser.add_argument("-thread", type=int, default=10, help="指定线程池大小，多线程爬取页面。")
    parser.add_argument("-dbfile", type=str, default="spider.sqlite", help="存放结果数据到指定的数据库。")
    parser.add_argument("-key", type=str, default=None, help="指定爬虫开始地址。")
    parser.add_argument("-logfile", "-f", type=str, default="spider.log", help="爬虫日志文件。")
    parser.add_argument("-loglevel", "-l", type=int, default=2, choices=[1, 2, 3, 4, 5], help="日志级别1-5，数字越大越详细。")
    parser.add_argument("-testself", type=bool, default=False, help="爬虫自测。")

    args = parser.parse_args()

    match args.loglevel:
        case 5:
            logLevel = spider_logging.OPERATION
        case 4:
            logLevel = spider_logging.PAGE
        case 3:
            logLevel = spider_logging.EXTRACTION
        case 2:
            logLevel = spider_logging.EXTRACTION_FAIL
        case 1:
            logLevel = spider_logging.PROGRESS
        case _:
            logLevel = spider_logging.PROGRESS

    spider_logging.init_logger(logLevel, args.logfile)
    p.init_db(args.dbfile)

    status = c.AmazonProductCrawler(
        start_url=args.url,
        key=args.key,
        depth=args.depth,
        thread=args.thread,
        on_data_extracted=on_amazon_product_extracted
    ).start()

    logger.log(spider_logging.PROGRESS,
               f"爬取结束: 已发现节点数={status[0]}, 已完成解析的节点数={status[1]}, 已发现的数据节点数={status[2]}, 已抽取数据的节点数={status[3]}")
